package jmine.tec.report;

import java.util.List;

/**
 * Representa uma tabela de dados com linhas e colunas.
 * 
 * @author julien
 * @author pedro última modificação: 16/02/2007 Pedro e Julien
 */
public interface DataTable {

    /**
     * Retorna a lista de DataRow's deste DataTable. Se não tiver nenhum DataRow retorna uma lista vazia.
     * 
     * @return List
     */
    List<DataRow> getRows();

    /**
     * Retorna o DataRow com o índice solicitado. Lança IndexOutOfBoundsException se o índice for inválido.
     * 
     * @param index int
     * @return DataRow
     */
    DataRow getRow(int index);

    /**
     * Adiciona um DataRow. Se o argumento for nulo lança NullPointerException.
     * 
     * @param row DataRow.
     */
    void addRow(DataRow row);

    /**
     * Adiciona todos os DataRow's deste List. Se o argumento for nulo lança NullPointerException.
     * 
     * @param rows List
     */
    void addRows(List<? extends DataRow> rows);

    /**
     * Remove um DataRow. Se o argumento for nulo lança NullPointerException.
     * 
     * @param row DataRow.
     */
    void removeRow(DataRow row);

    /**
     * Remove todos os DataRow's fornecidos. Se o argumento for nulo lança NullPointerException.
     * 
     * @param rows List
     */
    void removeRows(List<? extends DataRow> rows);

    /**
     * Retorna um List com os DataColumn's. Se não houver nenhum DataColumn retorna um List vazio.
     * 
     * @return List
     */
    List<? extends DataColumn> getColumns();

    /**
     * Retorna o DataColumn com o índice solicitado. Lança IndexOutOfBoundsException se o índice for inválido.
     * 
     * @param index int
     * @return DataColumn
     */
    DataColumn getColumn(int index);

    /**
     * Adiciona um DataColumn. Se o argumento for nulo lança NullPointerException.
     * 
     * @param column DataColumn
     */
    void addColumn(DataColumn column);

    /**
     * Adiciona os DataColumn's do List. Se o argumento for nulo lança NullPointerException.
     * 
     * @param columns List
     */
    void addColumns(List<? extends DataColumn> columns);

    /**
     * Remove o DataColumn. Se o argumento for nulo lança NullPointerException.
     * 
     * @param column DataColumn
     */
    void removeColumn(DataColumn column);

    /**
     * Remove os DataColumn's especificados. Se o argumento for nulo lança NullPointerException.
     * 
     * @param columns List
     */
    void removeColumns(List<? extends DataColumn> columns);

    /**
     * Retorna uma "visão" deste DataTable sem qualquer referência para objetos do modelo etc.
     * 
     * @return DataTable
     */
    DataTable toView();

    /**
     * Ordena os DataRow's pelo valor relativo à coluna especificada em ordem ascendente ou descendente. Se o argumento for nulo lança
     * NullPointerException.
     * 
     * @param column DataColumn
     * @param ascending boolean
     * @return uma copia deste datatable, ordenado pelos parametros passados
     */
    DataTable sort(DataColumn column, boolean ascending);

    /**
     * Ordena os DataRow's pelo valor relativo à coluna especificada pelo indice, em ordem ascendente ou descendente. Se o argumento for
     * nulo lança NullPointerException.
     * 
     * @param columnIndex o indice da coluna a ser ordenado
     * @param descending boolean se true, esta coluna sera em ordem decrescente
     * @return uma copia deste datatable, ordenado pelos parametros passados
     */
    DataTable sortByColumnIndex(int columnIndex, boolean descending);

    /**
     * @param nome to set
     */
    void setNome(final String nome);

    /**
     * @return o nome
     */
    String getNome();

    /**
     * Removes all {@link DataRow} from this {@link DataTable}
     */
    void removeAllRows();

    /**
     * Cria um DataCell segundo o MessageResolver
     * 
     * @param transformation a transformacao
     * @return o DataCell transformado
     */
    DataTable transform(DataCellTransformation transformation);

}
